package bitclub;

import herramientas.BitUtil;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.TreeSet;
import javax.management.timer.Timer;
import persistencia.POfertaDiaSemana;

/**
 * @author BIT COMPANY
 */
public class OfertaDiaSemana extends Oferta { //hereda de clase Oferta

    private String diaSemana;

    public OfertaDiaSemana(double descuento, double precioNuevo, int diasExtras, int tipo, Date fechaFin, Date fechaInicio, String nombre, int id, String diaSemana) {
        super(descuento, precioNuevo, diasExtras, tipo, fechaFin, fechaInicio, nombre, id);
        this.diaSemana = diaSemana;
    }

    public OfertaDiaSemana(double descuento, double precioNuevo, int diasExtras, int tipo, Date fechaFin, Date fechaInicio, String nombre, String diaSemana) {
        super(descuento, precioNuevo, diasExtras, tipo, fechaFin, fechaInicio, nombre);
        this.diaSemana = diaSemana;
    }

    public String getDiaSemana() {
        return diaSemana;
    }

    public void setDiaSemana(String diaSemana) {
        this.diaSemana = diaSemana;
    }

    @Override
    public String toString() {
        DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        if (this.getTipo() == 1) {
            return "Nombre Oferta: " + this.getNombre() + ""
                    + "\nDía de la semana: " + this.getDiaSemana() + ""
                    + "\nPorcentaje de descuento: " + this.getDescuento() + "%"
                    + "\nComprendido entra las fechas: " + df.format(this.getFechaInicio()) + ""
                    + " y " + df.format(this.getFechaFin());
        } else if (this.getTipo() == 2) {
            return "Nombre Oferta: " + this.getNombre() + ""
                    + "\nDía de la semana: " + this.getDiaSemana() + ""
                    + "\nDías extras para entregar: " + this.getDiasExtras() + ""
                    + "\nComprendido entra las fechas: " + df.format(this.getFechaInicio()) + ""
                    + " y " + df.format(this.getFechaFin());
        } else {
            return "Nombre Oferta: " + this.getNombre() + ""
                    + "\nDía de la semana: " + this.getDiaSemana() + ""
                    + "\nPrecio nuevo de alquiler: " + this.getPrecioNuevo()
                    + "\nComprendido entra las fechas: " + df.format(this.getFechaInicio()) + ""
                    + " y " + df.format(this.getFechaFin());
        }

    }

    public void nuevo(OfertaDiaSemana o) {

        POfertaDiaSemana.nuevoBD(o);

    }

    public void actualizar(OfertaDiaSemana o) {

        POfertaDiaSemana.actualizarBD(o);
    }

    public void eliminar(OfertaDiaSemana o) {
        POfertaDiaSemana.eliminarBD(o);
    }

    public static List<OfertaDiaSemana> seleccionarOferta(Date fechaBusqueda, String tipo) {

        List<OfertaDiaSemana> o = new ArrayList();

        o = POfertaDiaSemana.seleccionarOfertaBD(fechaBusqueda, tipo);

        return o;
    }

    public static void comprobarOferta(TreeSet<ArticuloAlquilado> listArticuloAlquilado) {
        List<OfertaDiaSemana> listOfertas;
        List<OfertaDiaSemana> listOfertasAplicadas = new ArrayList();
        Date fechaBusqueda = new Date();
        Date fechaEntrega;
        int ofertasAplicadas = 0;
        Calendar fechaActual = (GregorianCalendar) Calendar.getInstance();
        int diaActual = fechaActual.get(Calendar.DAY_OF_WEEK);

        int diaSemana = 0;
        int tipo = 0;
        int diasExtras = 0;
        double precioNuevo = 0;

        listOfertas = seleccionarOferta(fechaBusqueda, "Actuales"); //devuelve ofertas vigentes

        if (!listOfertas.isEmpty()) { //hay ofertas y hay q modificar la lista de articulos alquilados
            for (ArticuloAlquilado aa : listArticuloAlquilado) {
                for (OfertaDiaSemana o : listOfertas) {
                    if (o.getDiaSemana().equals("lunes")) {
                        diaSemana = 2;
                    } else if (o.getDiaSemana().equals("martes")) {
                        diaSemana = 3;
                    } else if (o.getDiaSemana().equals("miercoles")) {
                        diaSemana = 4;
                    } else if (o.getDiaSemana().equals("jueves")) {
                        diaSemana = 5;
                    } else if (o.getDiaSemana().equals("viernes")) {
                        diaSemana = 6;
                    } else if (o.getDiaSemana().equals("sabado")) {
                        diaSemana = 7;
                    } else if (o.getDiaSemana().equals("domingo")) {
                        diaSemana = 1;
                    }



                    //calendario.get(Calendar.DAY_OF_WEEK)                     
                    if (diaActual == diaSemana) { //primero vemos si nos encontramos en el dia de la semana correcto sino salimos
                        //se aplica oferta ya que se encuentra en el dia
                        ofertasAplicadas++;
                        listOfertasAplicadas.add(o);
                        tipo = o.getTipo();
                        if (tipo == 1) {
                            precioNuevo = aa.getArticulo().getTarifa().getPrecio() * (o.getDescuento() / 100);
                            precioNuevo = aa.getArticulo().getTarifa().getPrecio() - precioNuevo;
                            aa.setPrecioAlquiler(precioNuevo);
                        } else if (tipo == 2) {
                            diasExtras = o.getDiasExtras();
                            fechaEntrega = new Date(fechaBusqueda.getTime() + Timer.ONE_DAY * diasExtras);
                            aa.setFechaEntrega(fechaEntrega);
                        } else {
                            aa.setPrecioAlquiler(o.getPrecioNuevo());
                        }
                    }
                }
            }
        }
        System.out.println(BitUtil.muestraSubrayado("Se han aplicado " + ofertasAplicadas + " ofertas dia de la semana", "-"));
        for (OfertaDiaSemana o : listOfertasAplicadas) {
            System.out.println("\n" + o.toString() + "\n");
        }
    }
}
